perm filename NEWX.FAI[TMP,LCS] blob sn#121880 filedate 1974-10-22 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00011 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE X
C00003 00003	RPG MODE:
C00006 00004	NORPG:	SETZM RPGMOD#	TELL WORLD THAT SOME POOR LOSER IS RUNNING US MANUALLY
C00010 00005	YDEF:	ADD A,B		ADD SLICE OFFSET TO ORIGIN OFFSET
C00014 00006	DOIT:	ANDCM C,BITTAB(D)	MASK OUT BIT FOUND BY JFFO
C00017 00007	XINI:	SKIPE RPGMOD
C00023 00008	XGPOUT:	SKIPGE XGSFLG
C00026 00009	FNF:	PUSHJ P,DETCHK	COULDN'T FIND THE FILE
C00030 00010	GETNAM:	MOVEI A,
C00031 00011	FILNAM:	0
C00032 ENDMK
C⊗;
TITLE X


A←1
B←2
C←3
D←4
E←5
L←6
U←7
PEN←10
X←11
Y←12
XD←13
T←15
TT←16
P←17

LPDL←←69	;OBSCENE PDL

DSK←←1
XGP←←2

LMAR←←=0
RMAR←←=1699		;WE USE THE FULL SCAN WIDTH
WIDTH←←RMAR-LMAR+1
LBUFL←←<WIDTH+43>/44	;LBUFL WORDS x 36 BITS/WORD ≥ # BITS IN LINE
LSTBIT←←1⊗<LBUFL*44-WIDTH>	;POSITION OF LAST BIT IN LAST WORD OF EACH LBUF
OVERLAP←←=50			;OVERLAP 1/4 INCH
BOTTOM←←=50			;SHIFT BOTTOM UP 1/4 INCH

NBUFS←←4

EXTERN JOBREL,JOBFF

MAILBF:	BLOCK 40

SIGN:	0	;GLOBAL VARIABLE FOR RNUM TO INDICATE SCANNING OF A MINUS SIGN
LINE:	0	;NUMBER OF TTY WHERE MESSAGES ARE SENT
PNTR:	0
;RPG MODE:
;REGISTER	CONTENTS
;	0	FILENAME
;	1	FILEXT,,SPOOL FLAG
;	2	FILPPN
;	3	MAX X,,MIN X	IN PLOTTER STEPS ALONG PAPER
;	4	MAX Y,,MIN Y	IN PLOTTER STEPS ACROSS PAPER
;	5	GETLIN DONE FROM PLOT PROG

COMMENT ⊗
 EXTERNAL X AXIS BECOMES INTERNAL Y AXIS, + ALONG THE DIRECTION OF PAPER MOTION
 EXTERNAL Y AXIS BECOMES INTERNAL X AXIS, + TO THE RIGHT ACROSS 8.5" WIDTH OF PAPER
 REFERENCES TO X & Y IN CODE COMMENTS ARE TO INTERNAL COORDINATE SYSTEM
 MINX IS THE DISTANCE FROM THE ORIGIN TO THE LEFT EDGE OF THE DRAWING
 MAXX IS THE DISTANCE FROM THE ORIGIN TO THE RIGHT EDGE OF THE DRAWING
 MINY IS THE DISTANCE FROM THE ORIGIN TO THE BOTTOM EDGE OF THE DRAWING
 MAXY IS THE DISTANCE FROM THE ORIGIN TO THE TOP EDGE OF THE DRAWING
 PEN-UP EXCURSIONS OFF THE EDGES OF THE PLOT BUFFER DON'T RAISE THE OUT OF
 BOUNDS ALARM (I THINK)
⊗

BEG:	JRST NORPG	;NORMAL STARTUP
	SETOM RPGMOD	;RPG CALL, STORE THE GOODIES PASSED IN THE ACS
	MOVEM 0,FILNAM
	MOVEM 0,XGSNAM
	HLLZM 1,FILEXT
	HRLZM 1,XGSFLG#
	MOVSI 1,'XG0'
	MOVEM 1,XGSEXT
	MOVEM 2,FILPPN
	MOVEM 2,XGSPPN
	MOVEM 3,RPGX#
	MOVEM 4,RPGY#
	MOVEM 5,LINE
	OUTSTR[ASCIZ/WELCOME TO X!	;GREET THE LOSER IF HE'S WATCHING
/]
	MOVE 1,['[PLX] ']
	MOVE P,[IOWD LPDL,PDL]
	PUSHJ P,DETCHK		;SEE IF WE'RE DETACHED
	SETNAM 1,		;CHANGE TO IMPRESSIVE NAME IF WE ARE
	RESET
	HRRE A,RPGY	;GET OFFSET FROM ORIGIN TO LEFT EDGE OF PLOT
	MOVN A,A	;CHANGE SENSE OF OFFSET TO "OFFSET FROM EDGE TO ORIGIN"
	ADDI A,BOTTOM	;INCLUDE MARGIN
	JRST YDEF1	;SNEAK AROUND NORMAL ENTRY MODE STUFF

NORPG:	SETZM RPGMOD#	;TELL WORLD THAT SOME POOR LOSER IS RUNNING US MANUALLY
	SETOM LINE
	GETLIN LINE		;FIND OUT WHO WE GET TO BITCH AT
MERGE:	RESET
	MOVE P,[IOWD LPDL,PDL]	;STACKS ARE FUN--EVEN MORE SO IF THEY'RE INITIALIZED
FILIN:	OUTSTR [ASCIZ /FILE?/]
	PUSHJ P,FRD	;FILL UP THE BLOCK AT FILNAM WITH GOOD STUFF

YAGAIN:	OUTSTR [ASCIZ/
PLOT SLICE? (0 OR <CR> FOR SINGLE PAGE PLOTS) /]	;NICE HUMANE PROMPT

	SETZ A,	;A ISN'T CLOBBERED IN RNUM IF <CR> IS TYPED SO CLEAR IT FIRST

	PUSHJ P,RNUM	;WINNING HELLIWELL NUMBER SCANNER- AC 'A' CONTAINS DECIMAL
; CONVERSION OF FIRST DIGIT STRING FOUND, AC 'C' CONTAINS DELIMITER FOR THAT STRING,
; ("+" AND <CR> ARE FLUSHED), SIGN CONTAINS -1 IF STRING WAS PRECEEDED BY "-", 0
; OTHERWISE, AND SKIP RETURN IS TAKEN. IF NO STRING WAS TYPED, NORMAL RETURN
; IS TAKEN AND AC 'A' LEFT UNMOLESTED.

	JRST YAGN1	;<CR> WAS TYPED
	JUMPL A,YAGAIN	;IDIOT TYPED NEGATIVE NUMBER
	CAIE C,12	;ANY GARBAGE AFTER NUMBER?
	JRST YAGAIN	;YUP, FLUSH AND TRY AGAIN
	IMULI A,WIDTH-OVERLAP	;CONVERT SLICE SPEC TO BIT COUNT REPRESENTING
				;(NO. OF PAGE WIDTHS-TAPING OVERLAP PER PAGE)
YAGN1:	ADDI A,BOTTOM	;INCLUDE 1/4" BOTTOM MARGIN
	MOVE B,A	;SAVE X OFFSET

YAGN2:	OUTSTR [ASCIZ/
ORIGIN Y OFFSET FROM BOTTOM (DEFAULT IS -1)? /]

	PUSHJ P,RNUM	;W.H.N.S. AGAIN
	JRST [	HRREI A,-=200	;DEFAULT DIST. FROM EDGE TO ORIGIN
		JRST YDEF]
	IMULI A,=200	;SCALE WHOLE NUMBER PART INTO STEPS
	CAIE C,"."		;STRING DELIMITED BY DECIMAL POINT?
	JRST YDEFP		;NO
	INCHWL C	;SCANNER KLUDGE FOR TENTHS DIGIT
	CAIN C,15
	INCHWL C
	CAIL C,"0"
	CAILE C,"9"
	JRST .+1
	SUBI C,60
	IMULI C,=20	;SCALE TENTHS DIGIT INTO STEPS
	SKIPE SIGN	;SIGN GETS SET IN RNUM IF "-" PRECEEDED NUMBER
	MOVN C,C	;SO FIX SIGN OF FRACTION IF NECESSARY
	ADD A,C		;INCORPORATE TENTHS DIGIT IN WHOLE NUMBER PORTION
	PUSH P,A
	PUSHJ P,RNUM	;GOBBLE REST OF FRACTIONAL PORTION
	JFCL
	POP P,A
YDEFP:	CAIE C,12	;ANY GARBAGE LEFT?
	JRST [	CLRBFI	;YES, FLUSH AND DO IT AGAIN
		JRST YAGN2]
YDEF:	ADD A,B		;ADD SLICE OFFSET TO ORIGIN OFFSET
YDEF1:	MOVEM A,INIX#	;STORE AS INITIAL X
	HRRZS LINE	;CLEAR ALL BUT LINE # OF DESTINATION TTY FOR MESSAGES
AGAIN:	MOVE A,[FILNAM,,LKENT]
	BLT A,LKENT+3
	OPEN DSK,[14↔'DSK   '↔IBUF]	;OPEN INPUT CHANNEL
	JRST 4,.
	INBUF DSK,NBUFS	;SET UP BUFFER RING
	LOOKUP DSK,LKENT	;LOOKUP .PLX FILE
	JRST FNF		;LOSE-NOBODY HOME
ASKLEN:	PUSHJ P,XINI	;IF XINI WINS, IT TAKES THE SKIP RETURN WITH ENOUGH
; CORE IN JOB SPACE FOR PLOT, AND THE FOLLOWING CELLS SET UP:

; (A,B,PEN,X,Y,&XD ARE AC'S, "Y→FOO" MEANS RIGHT HALF OF Y POINTS TO LOCATION FOO)

; "VIDEO WORD NUMBER 1" IS THE SECOND WORD IN ANY LINE BUFFER (FIRST IS GCW)

; IYPOS IS THE INDEX INTO THE PLOT BUFFER OF THE FIRST WORD OF THE LINE BUFFER
; REPRESENTING THE Y COORDINATE OF THE PLOT ORIGIN (NEG IF OFF TOP OF PAGE).

; B CONTAINS A ONE IN THE STARTING BIT POSITION OF THE ORIGIN VIDEO WORD

; U CONTAINS JOBREL

; PEN CONTAINS <CAIA BYTTAB>

; 1(L) IS THE ADDRESS OF THE FIRST WORD OF THE PLOT BUFFER (WHICH IN TURN IS
; THE GCW OF THE FIRST SCAN LINE)

; XD POINTS TO SECOND WORD OF DBUF

; Y → VIDEO WORD NO. 1 OF ORIGIN LINE BUFFER 

; IF A=0 ORIGIN IS WITHIN X MARGINS, RHW(X)=ORIGIN VIDEO WORD NO., AND LHW(X)→Y

; IF A≠0 ORIGIN IS OFF PAGE, A+RHW(X)=ORIGIN VIDEO WORD NO., AND LHW(X)→XD

	JRST CORLUZ	;IF XINI LOSES, COMPLAIN
OUTER:	IN DSK,		;FILL BUFFERS FULL OF LOSING CALCOMP COMMANDS, 6 TO A WORD
	JRST INOK	;WIN
	STATO DSK,20000	;EOF?
	JRST 4,.	;NO, LOSE
	RELEAS DSK,	;YES, DONE WITH PLX FILE

IFN LSTBIT-1,<	MOVE A,[LSTBIT-1]	;FILL OUT LINE UNLESS LAST BIT OF LINE
		MOVE C,LINCNT		;BUFFER IS ON A WORD BOUNDARY
		HRRZ D,XGPPTR
	XFIXL:	ANDCAM A,LBUFL-1+2(D)
		ADDI D,LBUFL+1
		SOJG C,XFIXL
>;LSTBIT-1
	JRST XGPOUT	;CRANK THE MOTHER

INOK:	MOVN E,IBUF+2	;GET -WORD COUNT
	MOVSI E,(E)	;PUT IN LHW(E)
	HRR E,IBUF+1	;PUT POINTER TO CELL PRECEDING FIRST BUFFER WORD INTO RHW(E)
MAIN:	MOVE C,1(E)	;GET A WORD
	JFFO C,DOIT	;IF ITS GOT SOME BITS ON, FIND THE FIRST ONE AND INTERPRET
	AOBJN E,MAIN	;IF NOT, GET ANOTHER WORD
	JRST OUTER	;GET ANOTHER BUFFER FULL

DOIT:	ANDCM C,BITTAB(D)	;MASK OUT BIT FOUND BY JFFO
	XCT MOVI1(D)
	XCT MOVI2(D)
DOI3:	XCT MOVI3(D)
DOPEN:	XCT PEN
	IORM B,@X
DONXT:	JFFO C,DOIT
	AOBJN E,MAIN
	JRST OUTER

MOVI1:	REPEAT 6,{
	HRLI PEN,(<CAIA>)	;PEN UP		(40 BIT)
	HRLI PEN,(<TDNN C,(D)>)	;PEN DOWN	(20 BIT)
	JUMPGE B,DOI3		;DRUM DOWN	(10 BIT)
	ROT B,-1		;DRUM UP	( 4 BIT)
	SUBI Y,LBUFL+1		;CARRIAGE LEFT	( 2 BIT)
	ADDI Y,LBUFL+1		;CARRIAGE RIGHT	( 1 BIT)
}
MOVI2:	REPEAT 6,{
	JRST DONXT
	JRST DONXT
	XCT XMOVL(X)
	JUMPGE B,DOPEN
	CAIGE Y,(L)
	CAIL Y,-LBUFL-1(U)
}
MOVI3:	REPEAT 6,{
	JRST 4,.
	JRST 4,.
	ROT B,1
	XCT XMOVR(X)
	JRST LOSE
	JRST LOSE
}
	ADDI A,1

XMOVL:	HRLOI X,XD
	REPEAT LBUFL-1,<SUBI X,1>
	SOJL A,.+1
	MOVE X,[Y,,LBUFL-1]
	AOJA A,DOI3

	SOJL A,XONR
XMOVR:	REPEAT LBUFL-1,<ADDI X,1>
	MOVE X,[XD,,LBUFL]
	ADDI A,1

XONR:	MOVSI X,Y
	AOJA A,DOPEN
XINI:	SKIPE RPGMOD

	JRST [	HLRE A,RPGX	;GET MAX X
		HRRE B,RPGX	;AND MIN X
		SUB A,B		;FIND DIF
		ADDI A,=100	;LEAVE 1/4 INCH MARGIN AT EACH END
		SUBI B,=50	;INCORPORATE 1/4 INCH INTO MIN X
		IMULI B,LBUFL+1	;MAKE IT WORDS IN MEMORY
		MOVNM B,IYPOS#	;INITIAL Y POS. (REFERRED TO TOP EDGE)
		JRST XDEF]

XINI1:	OUTSTR [ASCIZ /TOTAL LENGTH IN INCHES (X DIMENSION, DEFAULT = 11)? /]
	PUSHJ P,RNUM
	MOVEI A,=11	;GIVE HIM DEFAULT LENGTH

	JUMPLE A,[	XINLER:	CLRBFI		;IDIOT TYPED A NEGATIVE NUMBER
				JRST XINI1]

	CAIE C,12	;ANY GARBAGE BEYOND NUMBER?
	JRST XINLER	;YEAH, FLUSH & TRY AGAIN
	IMULI A,=200	;CHANGE INCHES TO XGP SCAN LINES
	PUSH P,A	;SAVE THIS
YINI1:	OUTSTR [ASCIZ \ORIGIN X OFFSET FROM LEFT END(DEFAULT IS 1/2 LENGTH)? \]
	PUSHJ P,RNUM

	JRST [	MOVE A,(P)	;DEFAULT--RESTORE LENGTH TO A
		ASH A,-1	;DIVIDE BY 2
		IMULI A,LBUFL+1	;CONVERT TO WORDS IN MEMORY
		JRST IYDEF]

	CAIE C,12	;END OF STUFF?

	JRST [	CLRBFI	;NO, FLUSH
		JRST YINI1]

	IMULI A,=200*(LBUFL+1)	;CONVERT FROM INCHES TO WORDS IN MEMORY
IYDEF:	MOVEM A,IYPOS	;SAVE INITIAL Y OFFSET
	POP P,A		;RESTORE TOTAL NUMBER OF SCAN LINES TO A
XDEF:	MOVEM A,LINCNT#	;SAVE LINE COUNT
	MOVEI B,-1(A)	;B←LINE COUNT - 1 (USED BELOW IN LOOP AT XINL)
	IMULI A,LBUFL+1	;A←TOTAL NUMBER OF WORDS NEEDED TO CONTAIN PLOT
	MOVE T,JOBFF
	MOVEM T,XGPPTR
	SOS XGPPTR	;RHW(XGP POINTER) ← JOBFF - 1
	MOVEI T,2(A)	;T←2+(LINE COUNT)*(LINE BUFFER LENGTH + 1)
	MOVNI TT,(T)	;TT← - T
	ADD T,XGPPTR	;T←2+LINCNT*(LBUFL+1)+JOBFF-1
	HRLM TT,XGPPTR	;LHW(XGPPTR)← -(PLOT BUFFER + 2)
	MOVE TT,T	;SAVE REQUIRED JOB SIZE IN TT
	CORE T,		;BEG FOR CORE
	POPJ P,		;LOSE
	HRRZ L,XGPPTR	;L←OLD TOP OF WORLD
	MOVSI T,1(L)	;LHW(T)← FIRST WORD OF PLOT BUFFER
	HRRI T,2(L)	;RHW(T)← SECOND WORD OF PLOT BUFFER
	SETZM 1(L)	;CLEAR OLD TOP OF WORLD + 1 (BOTTOM OF XGP BUFFER)
	MOVE U,JOBREL	;PUT NEW TOP OF WORLD IN U
	BLT T,(U)	;CLEAR THE PLOT BUFFER (AND REST OF CORE TO JOBREL)
	MOVE TT,[BYTE (12)4001,LMAR,LBUFL]	;SET UP GCW
	MOVEM TT,1(L)	;INSERT GCW FOR FIRST LINE (INCLUDES MARK&CUT)
	TLZ TT,400000	;DELETE MARK AND CUT FROM SUCCEEDING LINES
	MOVEI T,1+LBUFL+1(L)	;T←ADDRESS OF START OF SECOND SCAN LINE
XINL:	MOVEM TT,(T)	;STUFF MARKLESS AND CUTLESS COMMAND WHERE T POINTS
	ADDI T,LBUFL+1	;BUMP POINTER TO START OF NEXT SCAN LINE
	SOJG B,XINL	;STUFF COMMAND IN FRONT OF EACH REMAINING LINE BUFFER
	MOVSI TT,400100
	MOVEM TT,(T)	;PUT MARK AND CUT COMMAND AT END OF LAST LINE
	MOVE PEN,[CAIA BYTTAB]	;BYTTAB POINTS TO TABLE OF SIX SETS OF SIX
				;WORDS CONTAINING 770000,,0 IN EACH WORD OF
				;SET 1, 007700,,0 IN EACH WORD OF SET 2, ETC.

	MOVE Y,IYPOS
	ADDI Y,2(L)	;Y POINTS TO FIRST VIDEO WORD OF ORIGIN LINE BUFFER 
	MOVEI XD,DBUF+1	;DBUF POINTS TO BUFFER OF LENGTH LBUFL+2
	SKIPL A,INIX	;START INSIDE BORDER OR OUT?(INIX IS #GRID POINTS)
	JRST MAYBON	;MAY BE ON PAPER
	SUBI A,43	;DEFINITELY OFF LEFT EDGE--FIGURE OUT HOW FAR IN WORDS
	IDIV A,[-44]
	HRLOI X,XD	;LHW(X)←ADDRESS OF XD, RHW(X)← -1
	SOJA A,SETB	;A CONTAINS NO. OF WORD BOUNDARIES TO BE CROSSED
			;TO REACH LEFT EDGE OF PAGE

MAYBON:	ADDI A,43
	IDIVI A,44	;A←(INIX+35) MOD 36--THE WORD IN LBUF WHERE PLOTTING BEGINS
	CAILE A,LBUFL	;ARE WE OFF THE RIGHT EDGE?
	JRST OFFRT	;YUP
	MOVE X,A	;NOPE, SAVE STARTING POINT IN X
	SETZ A,		;CLEAR A BEFORE GOING TO SETB
	HRLI X,Y	;LHW(X)←ADDRESS OF Y
	JRST SETB

OFFRT:	MOVE X,[XD,,LBUFL]	;LHW(X)←ADDRES OF XD, RHW(X)←LINE BUFFER LENGTH
	SUBI A,LBUFL	;A NOW CONTAINS NUMBER OF WORDS BY WHICH ORIGIN IS
			;OFF RIGHT END OF SCAN LINE, MINUS ONE LINE BUFFER LENGTH

SETB:	MOVE B,INIX	;B← START (IN GRID POINTS)
	IDIVI B,44	;C←STARTING BIT NUMBER IN WORD
	MOVSI B,400000
	MOVN C,C
	ROT B,(C)	;B NOW CONTAINS A ONE WHERE THE PLOT STARTS
POPJ1:	AOS (P)
CPOPJ:	POPJ P,
XGPOUT:	SKIPGE XGSFLG
	JRST [	OPEN XGP,[17↔'DSK   '↔0]
		JRST DSKERR
		HLLZS XGSEXT
		SETZM XGSEXT+1
		MOVE A,XGSPPN
		ENTER XGP,XGSNAM
		JRST DSKERR
		MOVEM A,XGSPPN
		JRST OUTIT]
	OPEN XGP,[1017↔'XGP   '↔0]
	JRST NOXGP
	OUTSTR[ASCIZ/CRANKING XGP
/]
	LOCK
OUTIT:	OUT XGP,XGPPTR
	JRST OUTOK
DSKERR:	PUSHJ P,DETCHK
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ /XGP OUTPUT ERROR.
/
OUTOK:	UNLOCK
	RELEAS XGP,
	SKIPN RPGMOD
	JRST XMORE
	MOVSI A,1
	ADDM A,XGSEXT		;SETUP FOR NEXT PART OF XG.. FILE
	MOVN A,INIX
	ADDI A,WIDTH-OVERLAP	;MAKE SURE WE CAN TAPE IT
	HLRE B,RPGY		;GET MAX Y
	SUBI B,OVERLAP		;ACCOUNT FOR OVERLAP IN A
	CAMGE A,B		;HIGH ENOUGH YET?
	JRST [	OUTSTR[ASCIZ/GOING BACK FOR ANOTHER PASS
/]
		JRST YDEF]		;NO, MAKE ANOTHER PASS
XMORE:	PUSHJ P,CORDWN			;REALLY DONE, CORE DOWN
	PUSHJ P,DETCHK
	JRST DODEL			;DELETE AUTOMATICALLY IF DETACHED
	OUTSTR[ASCIZ/DELETE PLX FILE?/]
	INCHRW C
	CAIN C,15
	INCHRW C
	CAIE C,12
	OUTSTR[ASCIZ/
/]
	CAIE C,"Y"
	CAIN C,"y"
	CAIA
	JRST NODEL
DODEL:	MOVE A,[FILNAM,,LKENT]
	BLT A,LKENT+3
	INIT DSK,17
	'DSK   '
	0
	JRST [	SKIPGE DET
		PUSHJ P,XERR
		PUSHJ P,ERRPNT
		ASCIZ/COULDN'T GET DISK FOR DELETE!
/
		JRST NODEL]
	LOOKUP DSK,LKENT
	JRST [	SKIPGE DET
		PUSHJ P,XERR
		PUSHJ P,ERRPNT
		ASCIZ/LOOKUP FOR DELETE FAILED!
/
		JRST NODEL]
	MOVE A,FILPPN
	MOVEM A,LKENT+3
	SETZM LKENT
	RENAME DSK,LKENT
	CAIA
	JRST NODEL
	SKIPGE DET
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ/RENAME FOR DELETE FAILED!
/
NODEL:	RELEASE DSK,
	SKIPGE DET
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ/ALL DONE!
/
	EXIT		;LEAVE

NOXGP:	PUSHJ P,DETCHK
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ /XGP NOT AVAILABLE (I THOUGHT I WAS WAITING FOR IT)!
/
	POPJ P,

XGPPTR:	BLOCK 2

CORDWN:	MOVE T,JOBFF
	SUBI T,1
	CORE T,
	JRST 4,.
	POPJ P,
FNF:	PUSHJ P,DETCHK	;COULDN'T FIND THE FILE
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ /LOOKUP FAILED.
/			;COMPLAIN APPROPRIATELY
	SKIPGE DET
	EXIT		;QUIT IF WE'RE DETACHED
	SETZM RPGMOD
	JRST FILIN	;NOT DETACHED-TRY AGAIN

CORLUZ:	MOVE T,TT	;NOT ENOUGH CORE-TELL HIM HOW MUCH WE'D LIKE
	LSH T,-12
	PUSH P,T
	PUSHJ P,DETCHK
	PUSHJ P,XERR
	POP P,T
	PUSHJ P,DECOUT
	PUSHJ P,ERRPNT
	ASCIZ / K OF CORE NEEDED!
/
	SKIPGE DET
	EXIT		;GIVE UP IF DETACHED
	SETZM RPGMOD	;BE SLUGGISHLY INTERACTIVE IF WE'RE NOT
	JRST ASKLEN

LOSE:	PUSHJ P,DETCHK	;PLOT TOO BIG IN Y DIRECTION
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ /POINT OUT OF BOUNDS, /
	CAIGE Y,(L)
	JRST [	PUSHJ P,ERRPNT
		ASCIZ/-X/
		JRST LOSE1]
	PUSHJ P,ERRPNT
	ASCIZ/+X/
LOSE1:	PUSHJ P,ERRPNT
	ASCIZ/, TRY AGAIN!
/
	PUSHJ P,CORDWN
	SKIPGE DET
	EXIT
	SETZM RPGMOD
	JRST AGAIN

DECOUT:	IDIVI T,=10
	HRLM TT,(P)
	SKIPE T
	PUSHJ P,DECOUT
	HLRZ TT,(P)
	ADDI TT,60
	ROT TT,-7
	MOVEM TT,.+2
	PUSHJ P,ERRPNT
	0
	POPJ P,

ERRPNT:	HRRZ TT,(P)
	MOVEM TT,PNTR
	MOVEI TT,LINE
	TTYMES TT,
	JRST [	OUTSTR[ASCIZ/TTYMES FAILED	/]
		OUTSTR @PNTR
		OUTSTR[ASCIZ/
/]
		JRST .+1]
	POP P,TT
	HRL TT,(TT)
	TLNE TT,376
	AOJA TT,.-2
	JRST 1(TT)

XERR:	PUSHJ P,ERRPNT
	ASCIZ/
MESSAGE FROM X WORKING ON /
	MOVE TT,FILNAM
	PUSHJ P,SIXOUT
	PUSHJ P,ERRPNT
	ASCIZ/./
	HLLZ TT,FILEXT
	PUSHJ P,SIXOUT
	PUSHJ P,ERRPNT
	ASCIZ/[/
	MOVE TT,FILPPN
	PUSHJ P,SIXOUT
	PUSHJ P,ERRPNT
	ASCIZ/] : /
	POPJ P,

SIXOUT:	JUMPE TT,CPOPJ
	SETZ T,
	LSHC T,6
	ADDI T,40
	PUSH P,TT
	ROT T,-7
	MOVEM T,.+2
	PUSHJ P,ERRPNT
	0
	POP P,TT
	JRST SIXOUT

DETCHK:	SETOM DET#
	GETLIN DET
	HRRES DET
	SKIPL DET
	AOS (P)
	POPJ P,
FRD:	MOVSI A,'PLX'
	MOVEM A,FILEXT
	PUSHJ P,GETNAM
	JUMPE A,.+2
	MOVEM A,FILNAM
	CAIE C,"."
	JRST NOEXT
	PUSHJ P,GETNAM
	MOVEM A,FILEXT
NOEXT:	CAIE C,"["
	JRST FRDX
	PUSHJ P,GETP
	HRLZM A,FILPPN
	PUSHJ P,GETP
	HRRM A,FILPPN
FRDX:	INCHRW C
	CAIE C,12
	JRST FRDX
	POPJ P,

RNUM:	INCHWL C
	CAIN C,15
	JRST RNUM
	CAIN C,12
	POPJ P,
	AOS (P)
	MOVEI A,
	SETZM SIGN	;WINNING GAFFORD MOD TO WINNING HELLIWELL NUMBER SCANNER
	CAIN C,"-"
	JRST [	PUSHJ P,RNUML
		SETOM SIGN
		MOVN A,A
		POPJ P,]
	CAIN C,"+"
RNUML:	INCHWL C
	CAIL C,"0"
	CAILE C,"9"
	JRST RNUMX
	IMULI A,12
	ADDI A,-"0"(C)
	JRST RNUML

RNUMX:	CAIN C,15
	INCHRW C
	POPJ P,
GETNAM:	MOVEI A,
	MOVE B,[440600,,A]
GETNML:	PUSHJ P,RCH
	POPJ P,
	SUBI C,40
	TLNE B,770000
	IDPB C,B
	JRST GETNML

GETP:	MOVEI A,
GETPL:	PUSHJ P,RCH
	POPJ P,
	TRNE A,770000
	JRST GETPL
	LSH A,6
	ADDI A,-40(C)
	JRST GETPL

RCH:	INCHWL C
	CAIN C,42
	JRST RCHQ
	CAIE C,11
	CAIN C," "
	JRST RCH
	CAIE C,"."
	CAIN C,","
	POPJ P,
	CAIE C,"["
	CAIN C,"]"
	POPJ P,
RCHQR:	CAIGE C,40
	POPJ P,
	CAIL C,"a"
	CAILE C,"z"
	CAIA
	SUBI C,40
	JRST POPJ1

RCHQ:	INCHWL C
	JRST RCHQR
FILNAM:	0
FILEXT:	0
	0
FILPPN:	0

LKENT:	BLOCK 4

XGSNAM:	0
XGSEXT:	0
	0
XGSPPN:	0

IBUF:	BLOCK 3

BITTAB:	FOR I←43,0,-1{1⊗I
}
BYTTAB:	FOR I←36,0,-6{REPEAT 6,{77⊗I}}

DBUF:	BLOCK LBUFL+2

PDL:	BLOCK LPDL

END BEG